home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / hash / Hash_InitTable.c < prev    next >
C/C++ Source or Header  |  1988-07-28  |  3KB  |  90 lines

  1. /* 
  2.  * Hash_InitTable.c --
  3.  *
  4.  *    Source code for the Hash_InitTable library procedure.
  5.  *
  6.  * Copyright 1988 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: Hash_InitTable.c,v 1.3 88/07/28 17:57:28 ouster Exp $ SPRITE (Berkeley)";
  18. #endif not lint
  19.  
  20. #include <hash.h>
  21. #include <list.h>
  22. #include <stdlib.h>
  23.  
  24. /*
  25.  *---------------------------------------------------------
  26.  * 
  27.  * Hash_InitTable --
  28.  *
  29.  *    This routine just sets up the hash table.
  30.  *
  31.  * Results:    
  32.  *    None.
  33.  *
  34.  * Side Effects:
  35.  *    Memory is allocated for the initial bucket area.
  36.  *
  37.  *---------------------------------------------------------
  38.  */
  39.  
  40. void
  41. Hash_InitTable(tablePtr, numBuckets, keyType)
  42.     register Hash_Table *tablePtr;    /* Structure to use to hold table. */
  43.     int             numBuckets;    /* How many buckets to create for
  44.                      * starters. This number is rounded
  45.                      * up to a power of two.   If <= 0,
  46.                      * a reasonable default is chosen.
  47.                      * The table will grow in size later
  48.                      * as needed. */
  49.     int             keyType;    /* HASH_STRING_KEYS means that key
  50.                          * values passed to HashFind will be
  51.                      * strings, passed via a (char *)
  52.                      * pointer.  HASH_ONE_WORD_KEYS means
  53.                      * that key values will be any
  54.                      * one-word value passed as Address.
  55.                       * > 1 means that key values will be 
  56.                       * multi-word values whose address is
  57.                      * passed as Address.  In this last
  58.                      * case, keyType is the number of
  59.                      * words in the key, not the number
  60.                      * of bytes. */
  61. {
  62.     register    int         i;
  63.     register    List_Links     *bucketPtr;
  64.  
  65.     /* 
  66.      * Round up the size to a power of two. 
  67.      */
  68.  
  69.     if (numBuckets <= 0) {
  70.     numBuckets = 16;
  71.     }
  72.     tablePtr->numEntries = 0;
  73.     tablePtr->keyType = keyType;
  74.     tablePtr->size = 2;
  75.     tablePtr->mask = 1;
  76.     tablePtr->downShift = 29;
  77.     while (tablePtr->size < numBuckets) {
  78.     tablePtr->size <<= 1;
  79.     tablePtr->mask = (tablePtr->mask << 1) + 1;
  80.     tablePtr->downShift--;
  81.     }
  82.  
  83.     tablePtr->bucketPtr = (List_Links *) malloc((unsigned) (sizeof(List_Links)
  84.         * tablePtr->size));
  85.     for (i=0, bucketPtr = tablePtr->bucketPtr; i < tablePtr->size;
  86.         i++, bucketPtr++) {
  87.     List_Init(bucketPtr);
  88.     }
  89. }
  90.